﻿// @include "Browser.js"
/**
 * @fileOverview 类型判断类<br/> 本类使用
 *               javascript神秘花园提供的Object.prototype.toString.call方法进行强类型检测
 * 
 * @version qinglan_Type 1.0
 * @static
 * @author wxq wxqqh@qq.com
 */
/**
 * 命名空间
 * 
 * @namespace
 * @type Object
 */
window.qinglan = window.qinglan || {};
/**
 * 类型工具命名空间
 * 
 * @namespace
 * @type Object
 */
qinglan.Type = qinglan.Type || {};
/**
 * 判断对象是否为此类型<br/> *
 * 
 * @public
 * @static
 * @see 请参考 javascript神秘花园 <br/> 
 * 		<p style="color : #FFAA3E"> http://bonsaiden.github.com/JavaScript-Garden/zh/#types.typeof </p>
 * @param {String}
 *            type
 * @param {Object}
 *            obj
 * @return {Boolean}
 */
qinglan.Type.is = function(type, obj) {
	var klass = Object.prototype.toString.call(obj).slice(8, -1);
	return obj !== undefined && obj !== null && klass === type;
};
/**
 * 判断对象类型是否为数字
 * 
 * @public
 * @static
 * @param {Object}
 *            obj 需要判断的对象
 * @return {Boolean} 是否为数字
 */
qinglan.Type.isNumber = function(obj) {
	return qinglan.Type.is('Number', obj);
};

/**
 * 判断对象类型是否为字符串
 * 
 * @public
 * @static
 * @param {Object}
 *            obj 需要判断的对象
 * @return {Boolean} 是否为字符串
 */
qinglan.Type.isString = function(obj) {
	return qinglan.Type.is('String', obj);
};

/**
 * 判断对象类型是否为布尔值
 * 
 * @public
 * @static
 * @param {Object}
 *            obj 需要判断的对象
 * @return {Boolean} 是否为布尔值
 */
qinglan.Type.isBoolean = function(obj) {
	return qinglan.Type.is('Boolean', obj);
};
/**
 * 判断对象类型是否为Date对象
 * 
 * @public
 * @static
 * @param {Object}
 *            obj 需要判断的对象
 * @return {Boolean} 是否为Date对象
 */
qinglan.Type.isDate = function(obj) {
	return qinglan.Type.is('Date', obj);
};
/**
 * 判断对象类型是否为Array对象
 * 
 * @public
 * @static
 * @param {Object}
 *            obj 需要判断的对象
 * @return {Boolean} 是否为Array对象
 */
qinglan.Type.isArray = function(obj) {
	return qinglan.Type.is('Array', obj);
};
/**
 * 判断对象类型是否为Function对象
 * 
 * @public
 * @static
 * @param {Object}
 *            obj 需要判断的对象
 * @return {Boolean} 是否为Function对象
 */
qinglan.Type.isFunction = function(obj) {
	return qinglan.Type.is('Function', obj);
};

/**
 * 判断对象类型是否为RegExp对象
 * 
 * @public
 * @static
 * @param {Object}
 *            obj 需要判断的对象
 * @return {Boolean} 是否为RegExp对象
 */
qinglan.Type.isRegExp = function(obj) {
	return qinglan.Type.is('RegExp', obj);
};

/**
 * 判断对象类型是否为Object对象
 * 
 * @public
 * @static
 * @param {Object}
 *            obj 需要判断的对象
 * @return {Boolean} 是否为Object对象
 */
qinglan.Type.isObject = function(obj) {
	return qinglan.Type.is('Object', obj);
};

/**
 * 判断对象类型是否为Error对象
 * 
 * @public
 * @static
 * @param {Object}
 *            obj 需要判断的对象
 * @return {Boolean} 是否为Error对象
 */
qinglan.Type.isError = function(obj) {
	return qinglan.Type.is('Error', obj);
};
/**
 * 判断对象是否定义
 * 
 * @deprecated
 * @public
 * @static
 * @param {Object}
 *            varName 需要判断的对象
 * @return {Boolean} 是否定义
 */
qinglan.Type.isDefined = function(varName) {
	// 抛出 ReferenceError 异常
	return typeof varName !== 'undefined';
};

/**
 * 判断对象是否元素节点
 * 
 * @public
 * @static
 * @param {Object}
 *            obj 需要判断的对象
 * @return {Boolean} 是否定义
 */
qinglan.Type.isElement = function(obj) {
	return !!(obj && obj.nodeType == 1);
};
/**
 * 判断对象类型是否为Null对象
 * 
 * @public
 * @static
 * @param {Object}
 *            obj 需要判断的对象
 * @return {Boolean} 是否为Null对象
 */
qinglan.Type.isNull = function(obj) {
	if (qinglan.Browser && qinglan.Browser.isIE) {
		return obj === null;
	}
	return qinglan.Type.is('Null', obj);
};
/**
 * 判断对象类型是否为Undefined对象
 * 
 * @public
 * @static
 * @param {Object}
 *            obj 需要判断的对象
 * @return {Boolean} 是否为Undefined对象
 */
qinglan.Type.isUndefined = function(obj) {
	if (qinglan.Browser && qinglan.Browser.isIE) {
		return obj === undefined;
	}
	return qinglan.Type.is('Undefined', obj);
};